package br.com.tiespec.ejb.Ejb;

import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;

import br.com.tiespec.ejb.Dao.ClientePortalDAO;
import br.com.tiespec.ejb.Dao.PerfilDAO;
import br.com.tiespec.ejb.Dao.UsuarioDAO;
import br.com.tiespec.ejb.EjbInterface.SolicitacaoCadastroInterface;
import br.com.tiespec.ejb.Util.MensagemUtil;
import br.com.tiespec.model.Enum.SituClientePortal;
import br.com.tiespec.model.Enum.SituUsuario;
import br.com.tiespec.model.Enum.TipoSortOrder;
import br.com.tiespec.model.Modelo.ClientePortal;
import br.com.tiespec.model.Modelo.Usuario;
import br.com.tiespec.model.Util.CriptoHashUtil;
import br.com.tiespec.model.Util.DAOException;
import br.com.tiespec.model.Util.EmailUtil;
import br.com.tiespec.model.Util.RNException;

@Stateless(mappedName = "SolicitacaoCadastroImpl")
@Local
public class SolicitacaoCadastroImpl implements SolicitacaoCadastroInterface  {

	private static final long serialVersionUID = 5102186669151744959L;

	@EJB ClientePortalDAO cpDao;
	@EJB UsuarioDAO uDao;
	@EJB PerfilDAO pDao;
	
	@Override
	public List<ClientePortal> listarClientePortal(int first, int pageSize,
			String sortField, TipoSortOrder sortOrder,
			String varBuscaClientePortal) {
		return cpDao.listarClientePortal(first, pageSize, sortField, 
				sortOrder, varBuscaClientePortal);
	}

	@Override
	public Integer countClientePortal(String varBuscaClientePortal) {
		return cpDao.countClientePortal(varBuscaClientePortal);
	}

	@Override
	public ClientePortal selecionarClientePortal(Long id) throws RNException {
		return cpDao.selecionar(id);
	}

	@Override
	public void salvarClienteAndUsuario(String urlServidor, ClientePortal clientePortalInstance,
			Usuario usuarioInstance) throws RNException {
		try {
			usuarioInstance.setSituacao(SituUsuario.PENDENTE_APROVACAO_EMAIL);
			usuarioInstance.setDataCadastro(new Date());
			usuarioInstance.setPerfil(pDao.selecionarAdministradorCliente());
			usuarioInstance.setEmailEnviado(true);
			String token = CriptoHashUtil.hash("SHA1", usuarioInstance.getEmail().toLowerCase());
			usuarioInstance.setToken(token);
			
			enviarEmailUsuario(usuarioInstance.getEmail(), urlServidor+token);
			
			uDao.save(usuarioInstance);
			
			clientePortalInstance.setSituacao(SituClientePortal.PENDENTE_ATIVACAO_EMAIL);
			clientePortalInstance.setDataCadastro(new Date());
			clientePortalInstance.setResponsavel(usuarioInstance);
			
			cpDao.save(clientePortalInstance);
			
			usuarioInstance.setCliente(clientePortalInstance);
			uDao.save(usuarioInstance);
		} catch (DAOException e) {
			e.printStackTrace();
			throw new RNException(e);
		}
	}

	@Override
	public void salvarUsuario(String urlServidor, Usuario usuarioInstance) throws RNException {
		try {
			usuarioInstance.setSituacao(SituUsuario.PENDENTE_APROVACAO_EMAIL);
			usuarioInstance.setDataCadastro(new Date());
			usuarioInstance.setPerfil(pDao.selecionarBasico());
			String token = CriptoHashUtil.hash("SHA1", usuarioInstance.getEmail().toLowerCase());
			usuarioInstance.setToken(token);
			usuarioInstance.setEmailEnviado(true);
			enviarEmailUsuario(usuarioInstance.getEmail(), urlServidor+token);
			uDao.save(usuarioInstance);
		} catch (DAOException e) {
			e.printStackTrace();
			throw new RNException(e);
		}
	}

	private void enviarEmailUsuario(String email, String token) {
		try {
			String msg = MensagemUtil.getMsg("EmailAtivacao_Mensagem", token);
			EmailUtil mail = new EmailUtil();
			mail.setTitulo(MensagemUtil.getMsg("EmailAtivacao_Titulo"));
			mail.setMensagem(msg);
			mail.adicionarDestinatario(email);
			mail.send();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}